package vista;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.swing.table.AbstractTableModel;

import modelo.Material;
import modelo.MaterialPrenda;


/**
 * Esta clase representa el modelo de la tabla que se utiliza para agregar materiales en una prenda.
 *
 */
@SuppressWarnings("serial")
public class MaterialesTableModel extends AbstractTableModel  {
    
	private static final int SELECCIONADO = 0;
    private static final int CODIGO = 1;
    private static final int NOMBRE = 2;
    private static final int CANTIDAD = 3;
	
    /** lista que contiene los materiales */
	private List<Material> materiales;
    
    final static String[] columnNames = {"Seleccionado", "Codigo", "Nombre", "Cantidad"};
    
    boolean isEditable = true;

    public MaterialesTableModel(List<Material> materiales) {
        this.materiales = materiales;
    }

    public String getColumnName(int col) {
        return columnNames[col];
    }

   public int getRowCount() {
        return materiales.size();
    }

    public int getColumnCount() {
        return columnNames.length;
    }

    public Object getValueAt(int row, int col) {
        Object result = null;
        Material material = materiales.get(row);
        switch (col) {
            case SELECCIONADO:
                result = material.isSelected();
                break;
            case CODIGO:
                result = material.getCodigo();
                break;
            case NOMBRE:
                result = material.getNombre();
                break;
            case CANTIDAD:
                result = material.getCantidad();
                break;
        }
        return result;

    }
    
    @SuppressWarnings({ "unchecked", "rawtypes" })
	public Class getColumnClass(int c) {
    	if(c == SELECCIONADO){
    		return Boolean.class;
    	}
    	
        return String.class;
    }
    
    public void setMateriales(List<Material> materiales) {
		this.materiales = materiales;
		fireTableRowsInserted(materiales.size(), materiales.size());
	}
    
    public boolean isCellEditable(int row, int col) {
    	if(col == CANTIDAD || col == SELECCIONADO){
    		return true;
    	}
        return false;
    }
    
    public void setEditable(boolean isEditable){
        this.isEditable = isEditable;
    }

    public void setValueAt(Object value, int row, int col) {
        Material material = materiales.get(row);

        switch (col) {
	        case SELECCIONADO:
	        	Boolean selected = (Boolean)value;
	            material.setSelected(selected);
	            break;
	        case CANTIDAD:
	        	int cantidad = 0;
	        	try { 
	        		cantidad = Integer.parseInt((String)value); 
	    	        if(cantidad < 0){
	    	        	cantidad = 0;
	    	        }
	    	    } catch(NumberFormatException e) { 
	    	        
	    	    }
	            material.setCantidad(cantidad);
	            break;       }
    }
    
    public Map<String, Integer> getMaterialesSeleccionados() {
    	Map<String, Integer> seleccionados = new HashMap<String, Integer>();
    	for(Material material: materiales) {
    		if(material.isSelected()){
    			seleccionados.put(material.getCodigo(), material.getCantidad());
    		}
    	}
    	return seleccionados;
    }

	public void setMaterialesPrenda(List<MaterialPrenda> materialesPrenda) {
		for (Material material : materiales) {
			for(MaterialPrenda materialPrenda : materialesPrenda) {
				if(materialPrenda.getMaterial().hasCodigo(material.getCodigo())) {
					material.setSelected(true);
					material.setCantidad(materialPrenda.getCantidad());
				}
			}
		}
		
		fireTableRowsInserted(materiales.size(), materiales.size());
	}
}
